package main

import (
	"fmt"
)

/* 定义结构体 */
type Circle struct {
	radius float64
}

func main() {
	/* closure闭包
	* Go 语言支持匿名函数，可作为闭包。
	* 匿名函数是一个"内联"语句或表达式。
	* 匿名函数的优越性在于可以直接使用函数内的变量，不必申明。
	 */
	nextNumber := getSequence()
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())

	/* method方法
	* 一个方法就是一个包含了接受者的函数，
	* 接受者可以是命名类型或者结构体类型的一个值或者是一个指针。
	* 所有给定类型的方法属于该类型的方法集。
	 */
	var c Circle
	fmt.Printf("radius:%.1f\n", c.radius)
	c.radius = 3
	fmt.Printf("radius:%.1f\n", c.radius)
	fmt.Printf("area:%.1f\n", c.getArea())
	c.changeRadius(5)
	fmt.Printf("radius:%.1f\n", c.radius)
	fmt.Printf("area:%.1f\n", c.getArea())
	changeR(&c, 2)
	fmt.Printf("radius:%.1f\n", c.radius)
	fmt.Printf("area:%.1f\n", c.getArea())
}

// 闭包函数
func getSequence() func() int {
	i := 0
	return func() int {
		i++
		return i
	}
}

// 方法
func (c Circle) getArea() float64 {
	return 3.14 * c.radius * c.radius
}

func (c *Circle) changeRadius(radius float64) {
	c.radius = radius
}

func changeR(c *Circle, radius float64) {
	c.radius = radius
}
